import { delay } from 'redux-saga'
import { call, put, select } from 'redux-saga/effects'
import * as actionTypes from '@/app/Models/actions/actionTypes'
import { register } from '@/app/Api/auth'
import { replace } from 'react-router-redux'
import { setToken, removeToken } from '@/utils/auth'
import { isEmpty } from 'lodash'

// todo...  在user列表中，使用select，如果用户不存在，就清除所有state，跳转到登入页。
export function* registerSaga({ payload }) {
    try {
        // 存储用户数据
        const saveData = yield call(register, payload)

        if (!saveData) {
            throw new Error('数据存储失败')
        }
        // 发起一个action，把数据保存到store中
        yield put({
            type: actionTypes.REGISTER_USER_SAVE, 
            userInfo: saveData,
        })
        // 设置token
        yield call(setToken, 'Success')
        // 跳转到User页面
        yield put(replace('/user'))
    } catch(e) {
        // 发送全局error，改变reducer。
        yield put({
            type: actionTypes.REGISTER_ERROR,
            isRegisterError: true,
            errorMessage: e.message
        })
        // 跳转到500页面，展示error
        yield put(replace('/error/500'))
    }
}

// 登入副作用执行
export function* loginSaga({ payload }) {
    try {
        // 防抖动,延迟500毫秒执行
        yield call(delay, 500)
        const data = yield select(state => state.auth.userInfo)
        
        if (isEmpty(payload) || isEmpty(data)) {
            throw new Error('用户未注册')
        }
        
        if (data.name === payload.name && data.password === payload.password) {
            yield call(setToken, 'Success')
            yield put(replace('/user'))
        }

        throw new Error('账号或密码错误')
    } catch(e) {
            // 发送全局error，在view中获取错误。
            yield put({
                type: actionTypes.REGISTER_ERROR,
                isRegisterError: true,
                errorMessage: e.message
            })
    }
}

// 登出副作用执行
export function* logoutSaga(action) {
    yield call(removeToken)
    yield put(replace('/auth/login'))
}
